package com.xunwulian.dubbo.handler;

import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ReferenceConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

/**
 * 根据参数group，版本号等，动态获取需要的服务
 * @param <T>
 */
@Service
public class Consumer<T> {

    private static final Logger logger = LoggerFactory.getLogger(Consumer.class);

    private static final String SERVICE_VERSION = "0.0.1";

    public T getApi(Class clazz, String group, String appId, String registryAddress) {

        // 当前应用配置
        ApplicationConfig application = new ApplicationConfig();
        application.setName("consumer-" + clazz.getSimpleName() + "-" + appId);

        //连接注册中心配置
        RegistryConfig registry = new RegistryConfig();
        registry.setAddress(registryAddress);

        // 注意：ReferenceConfig为重对象，内部封装了与注册中心的连接，以及与服务提供方的连接
        // 引用远程服务
        ReferenceConfig<T> reference = new ReferenceConfig<>(); // 此实例很重，封装了与注册中心的连接以及与提供者的连接，请自行缓存，否则可能造成内存和连接泄漏
        reference.setApplication(application);
        reference.setRegistry(registry); // 多个注册中心可以用setRegistries()
        reference.setTimeout(10000);
        reference.setGroup(group == null || "".equals(group) ? "xwl" : group);
        reference.setInterface(clazz);
//        reference.setVersion(SERVICE_VERSION);

        // 和本地bean一样使用xxxService
        return reference.get(); // 注意：此代理对象内部封装了所有通讯细节，对象较重，请缓存复用
    }
}
